<?php

/**
 * 组合模式，这里通过一个继承 & 组合的 demo 来看继承和组合的差异和联系。
 *
 */

//继承模式

class UserBaseInfo
{
    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

class User extends UserBaseInfo
{
    private $login = false;

    public function setLogin($isLogin)
    {
        $this->login = $isLogin;
    }

    public function isLogin()
    {
        return $this->login;
    }
}

$user = new User('张三');
$user->setLogin(true);
if ($user->isLogin()) {
    echo $user->getName() . "已经登录了\n";
} else {
    echo $user->getName() . "没有登录\n";
}


/**
 * 组合模式，重点看看组合模式和继承模式的优缺点。
 * 下面的例子其实有点鸡肋，甚至有点缺陷，感觉是为了描述组合模式硬想出来的 demo，可怕。
 * 个人感觉描述组合模式最好的说明是 PHP 中的 trait
 */
class LoginInfo
{
    protected $user;
    protected $login = false;

    public function setLogin($user, $isLogin)
    {
        $this->user = $user;
        $this->login = $isLogin;
    }
    
    public function isLogin()
    {
        return $this->login;
    }
}

$user = new User('张三');
$login = new LoginInfo();
$login->setLogin($user, true);
if ($login->isLogin()) {
    echo $user->getName() . " 已经登录了\n";
} else {
    echo $user->getName() . " 还没有登录\n";
}

class Admin
{
    protected $level;
    
    public function __construct($level)
    {
        $this->level = $level;
    }

    public function getLevel()
    {
        return $this->level;
    }
}

$admin = new Admin(1);
$login->setLogin($admin, true);
if ($login->isLogin()) {
    printf("级别为 %d 的管理员已经登录了\n", $admin->getLevel());
} else {
    printf("级别为 %d 的管理员还未登录\n", $admin->getLevel());
}
